﻿/************************************************************************
 * AIDE - Automata Identification Engine
 * Copyright (C) 2012-2013 Ali Khalili (khalili_DOT_ir_@SIGN_gmail_DOT_com)
 * **********************************************************************
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License (LGPL) published 
 * by the Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version. This program is distributed without any
 * warranty. See the GNU Lesser General Public License for more details. 
 * ***********************************************************************
 * File         :     AIDE\Oracles\NFMs\IOracle_NMM.cs
 * Description  :     Interface for NMAT oracle for non-deterministic Mealy machines
 * Change log   :     -16 Feb 2013: "PossibleOutput" removed
 *                    -18 Feb 2013: "OutputAlphabet" removed.
 *                    -20 Feb 2013: convert string to ISymbol
 * To Do        :     -Use "word" and "sequence" instead of List of symbols/Ipairsymbols
 ************************************************************************/

using System;
using System.Collections.Generic;
using AIDE.Utils;
using SMLib.Automata.MM;
using SMLib.Automata.Base;

namespace AIDE.Oracles.NFMs
{
    /// <summary>
    /// Interface for NMAT oracle for non-deterministic Mealy machines
    /// </summary>
    public interface IOracle_NMM
    {
        /// <summary>
        /// NMAT equivalence query
        /// </summary>
        /// <param name="conjucture">the conjecture to be compared with</param>
        /// <returns>null if SUL and conjecture were equal, a sequence as the distinguishing counterexample</returns>
        List<PairOfSymbols> EquivalenceQ(MealyMachine conjucture);


        /// <summary>
        /// NMAT output query ("output query" is a better word than "membership query" which was used in MAT setting)
        /// </summary>
        /// <param name="prefix">the prefix sequence</param>
        /// <param name="suffix">the suffix word to be examined afterward</param>
        /// <returns>all possible outouts in a tree</returns>
        Tree</*Nothing,*/ ISymbol> FindOutputTree(List<PairOfSymbols> prefix, List<ISymbol> suffix);

        /// <summary>
        /// Input alphabet
        /// </summary>
        Alphabet inputAlphabet
        {
            get;
        }
    }
}
